package analizadorLexico.estados;

public class EstadoInicial implements Estado{

	/*aplico el patron singleton para cada estado*/
	
	/*INSTANCE lo que hace es guardar la instancia de la clase*/
	private static EstadoInicial INSTANCE = null;    
	private EstadoInicial(){}
	
    private synchronized static void createInstance() {
        if (INSTANCE == null) INSTANCE = new EstadoInicial();
    }
    
    public static Estado getInstance() {
        if (INSTANCE == null) createInstance();
        return INSTANCE;
    }

	public void irASiguienteEstado() {
		
		if(Contexto.esEndOfFile())
		{
			Contexto.setEstadoActual(EstadoFinal.getInstance());
		}
		else
		{
			char c=Contexto.getSiguienteCaracterYAvanzar();
			switch(c)
			{	
				case ';':	Contexto.setEstadoActual(Estado02.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '+':	Contexto.setEstadoActual(Estado03.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '\n':	//Contexto.setEstadoActual(EstadoInicial.getInstance());
							Contexto.aumentaLinea();
							Contexto.resetPosicionLinea();
							break;
				case ' ':	//Contexto.setEstadoActual(EstadoInicial.getInstance());
							break;
				case ')':	Contexto.setEstadoActual(Estado05.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '*':	Contexto.setEstadoActual(Estado07.getInstance());
							Contexto.appendAlLexema(c);	
							break;
				case '/':	Contexto.setEstadoActual(Estado08.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '%':	Contexto.setEstadoActual(Estado09.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case 'y':	Contexto.setEstadoActual(Estado10.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case 'o':	Contexto.setEstadoActual(Estado40.getInstance());/*letra o*/
							Contexto.appendAlLexema(c);
							break;
				case 'n':	Contexto.setEstadoActual(Estado69.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '(':	Contexto.setEstadoActual(Estado04.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '\'':	Contexto.setEstadoActual(Estado14.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '=':	Contexto.setEstadoActual(Estado68.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '>':	Contexto.setEstadoActual(Estado42.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '<':	Contexto.setEstadoActual(Estado43.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '-':	Contexto.setEstadoActual(Estado44.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '!':	Contexto.setEstadoActual(Estado31.getInstance());
							Contexto.appendAlLexema(c);
							break;
				case '@':	Contexto.setEstadoActual(Estado01.getInstance());
							break;
				case '0':	Contexto.setEstadoActual(Estado65.getInstance());/*cero*/
							Contexto.appendAlLexema(c);
							break;
				default:
					
					if(c=='-')
					{
						Contexto.setEstadoActual(Estado44.getInstance());
						Contexto.appendAlLexema(c);
						return;
					}
					if(Contexto.esLetraMayuscula(c))
					{
						Contexto.setEstadoActual(Estado11.getInstance());
						Contexto.appendAlLexema(c);
					}
					else
					{
						/*el cero ya lo habre descartado*/
						if(Contexto.esDigito(c))
						{
							Contexto.setEstadoActual(Estado45.getInstance());
							Contexto.appendAlLexema(c);
						}
						else
						{
							/*resto de letras minusculas*/
							if(Contexto.esLetraMinuscula(c))
							{
								Contexto.setEstadoActual(Estado33.getInstance());
								Contexto.appendAlLexema(c);
							}
							else
							{
								Contexto.generarErrorYReiniciar(new Character(c).toString(), "un caracter del lenguaje");
							}
						}
					}
			};
		}
	}
}
